/*
 * Nota_de_Venta.java
 *
 * Created on 2 de febrero de 2006, 13:14
 */ 



package administrador;

import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import java.sql.*;
import javax.swing.*;
import java.math.*;
import java.text.*;
//Probando
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jdesktop.application.Action;
/**
 *
 * @author  daniel1
 */
public class Nota_de_Venta extends javax.swing.JPanel {
    
    //Parametros:
    Conexion conexion;
    int s=0;
    int empleado=0;
    int bodega=1;
    String fecha;
    boolean actualizoSubtotal=true;
    boolean silimpio=false;
    javax.swing.JTabbedPane tp_controles;
    
    Usuario user;
    
    //Nath Redondeo
    NumberFormat nf = NumberFormat.getNumberInstance();
    //ClientesFactura cfactura;
    
    NumberFormat nff = NumberFormat.getNumberInstance();
    
    //Referencia para cerrar la ventana desde el viewer:
    AdministradorView aviewer;
    
    //Variable para entrada de detalles ayuda a ubicar el foco al insertar un dato
    //que ya existe en la factura.
    int ultimoLineDetalle;

    //BUscador de Producto:
    BuscadorProducto b;


    String terminal;
    /** Creates new form Nota_de_Venta */
    int opcionComprobante=0;
    double porcentajer;
    public Nota_de_Venta(Conexion cEnt,int BEnt,Usuario user,int opcionComprobante,javax.swing.JTabbedPane tp_controles) {
        this.tp_controles=tp_controles;
        DecimalFormat dec=(DecimalFormat)nf;
        DecimalFormat decf=(DecimalFormat)nff;
        dec.applyPattern("###.##");
        decf.applyPattern("###.####");
        this.opcionComprobante=opcionComprobante;
        bodega=BEnt;
        System.out.println("La bodega en uso es:"+bodega);
        conexion=cEnt;
        initComponents();

        b=new BuscadorProducto(conexion,this,bodega);

        //Para que no puedan mover las Columnas:
        tabla.getTableHeader().setReorderingAllowed(false) ;
        
        this.user=user;
        
        
        obtenParmetros();
        //Creo el trabajo de impresion:
        terminal=recuperaTerminal(String.valueOf(bodega),"%");
           
        
        cargaVendedor(user);
        
//        bt_mod.setVisible(false);
        txt_nom.setEditable(false);
        txt_dir.setEditable(false);
        txt_tel.setEditable(false);
        fecha=new java.sql.Date(System.currentTimeMillis()).toString();
        lbl_fecha.setText(fecha);
        
        
        int n=numeroFactura();
        cargaNombreTab(n);
        
        
        //Configuro Redondeo
        nf.setMaximumFractionDigits(2);
        nf.setRoundingMode(RoundingMode.HALF_UP);
        
        nff.setMaximumFractionDigits(4);
        nff.setRoundingMode(RoundingMode.HALF_UP);
        //visualiza el valor del iva 
        //txt_porIva.setText(consultarIva());
        txt_codFac.setVisible(false);
        btn_BuscaFac.setVisible(false);
        btn_anulaFac.setVisible(false);
        jLabel10.setVisible(false);
        lbl_anulacion.setVisible(false);
        jScrollPane2.setVisible(false);
        lbl_fechaAnulacion.setVisible(false);
        porcentajer=Double.parseDouble(consultarIva());
        txt_subCosot.setVisible(false);
        columnaAnchos(50,100,0);
        columnaAnchos(40,40,1);
        columnaAnchos(100,500,2);
        columnaAnchos(50,50,3);
        columnaAnchos(50,50,4);
        columnaAnchos(0,0,5);
        columnaAnchos(0,0,6);
    }
    
    public void columnaAnchos(int anchoMenor,int anchoMayor,int columnaNumero){
        tabla.getColumn(tabla.getColumnName(columnaNumero)).setMaxWidth(anchoMayor);
        tabla.getColumn(tabla.getColumnName(columnaNumero)).setMinWidth(anchoMenor);
        tabla.getColumn(tabla.getColumnName(columnaNumero)).setPreferredWidth(anchoMayor);
        tabla.getColumn(tabla.getColumnName(columnaNumero)).setResizable(false);
    }
    //Establesco lo referencia al administrador Viewer
    public void establecerReferencia(AdministradorView avEnt){
        aviewer=avEnt;
    
    }
    
    
    /** This method is called from within the constructor to
     * initialize the form.Action
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jLabel5 = new javax.swing.JLabel();
        jLabel9 = new javax.swing.JLabel();
        txt_tot = new javax.swing.JTextArea();
        jScrollPane1 = new javax.swing.JScrollPane();
        tabla = new javax.swing.JTable();
        bt_registra = new javax.swing.JButton();
        bt_limpiar = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        txt_nom = new javax.swing.JTextField();
        txt_dir = new javax.swing.JTextField();
        txt_tel = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        txt_id = new javax.swing.JTextField();
        bt_mod = new javax.swing.JButton();
        jLabel6 = new javax.swing.JLabel();
        txt_porDesc = new javax.swing.JTextField();
        bt_hist = new javax.swing.JButton();
        bt_ap = new javax.swing.JButton();
        bt_borrar = new javax.swing.JButton();
        jLabel14 = new javax.swing.JLabel();
        jLabel13 = new javax.swing.JLabel();
        lbl_vend = new javax.swing.JLabel();
        txt_vend = new javax.swing.JPasswordField();
        ck_desc = new javax.swing.JCheckBox();
        txt_desc = new javax.swing.JTextField();
        txt_codFac = new javax.swing.JTextField();
        btn_BuscaFac = new javax.swing.JButton();
        btn_anulaFac = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        txt_motAnula = new javax.swing.JTextArea();
        lbl_fechaAnulacion = new javax.swing.JLabel();
        jPanel1 = new javax.swing.JPanel();
        lbl_f = new javax.swing.JLabel();
        jLabel10 = new javax.swing.JLabel();
        lbl_fecha = new javax.swing.JLabel();
        lbl_anulacion = new javax.swing.JLabel();
        txt_subCosot = new javax.swing.JTextField();
        lbl_fact = new javax.swing.JTextField();

        jButton1.setText("jButton1");

        setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                formMouseEntered(evt);
            }
        });
        addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                formKeyReleased(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                formKeyTyped(evt);
            }
        });
        setLayout(null);

        jLabel5.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        jLabel5.setText("Factura Nro: ");
        add(jLabel5);
        jLabel5.setBounds(40, 80, 110, 20);

        jLabel9.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabel9.setText("Total");
        add(jLabel9);
        jLabel9.setBounds(550, 450, 70, 20);

        txt_tot.setEditable(false);
        txt_tot.setFont(new java.awt.Font("Tahoma", 1, 11));
        txt_tot.setForeground(new java.awt.Color(204, 102, 0));
        txt_tot.setText("0.00");
        txt_tot.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        add(txt_tot);
        txt_tot.setBounds(600, 450, 140, 20);

        jScrollPane1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(198, 196, 196)));

        tabla.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        tabla.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null}
            },
            new String [] {
                "Codigo", "Cant.", "Articulo", "PVP", "Total", "Precio Costo", "Subtotal Cosoto"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.Integer.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                true, true, false, false, false, true, true
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tabla.getModel().addTableModelListener(new MyTableChangedListener());
        tabla.addInputMethodListener(new java.awt.event.InputMethodListener() {
            public void caretPositionChanged(java.awt.event.InputMethodEvent evt) {
            }
            public void inputMethodTextChanged(java.awt.event.InputMethodEvent evt) {
                tablaInputMethodTextChanged(evt);
            }
        });
        jScrollPane1.setViewportView(tabla);

        add(jScrollPane1);
        jScrollPane1.setBounds(40, 200, 700, 180);

        bt_registra.setText("Registrar");
        bt_registra.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_registraActionPerformed(evt);
            }
        });
        add(bt_registra);
        bt_registra.setBounds(630, 480, 110, 30);

        bt_limpiar.setText("Limpiar Todo");
        bt_limpiar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_limpiarActionPerformed(evt);
            }
        });
        add(bt_limpiar);
        bt_limpiar.setBounds(510, 480, 120, 30);

        jLabel1.setText("Nombre");
        add(jLabel1);
        jLabel1.setBounds(40, 110, 70, 30);

        jLabel2.setText("Direccion");
        add(jLabel2);
        jLabel2.setBounds(40, 140, 70, 20);

        jLabel3.setText("Telefono");
        add(jLabel3);
        jLabel3.setBounds(390, 140, 70, 20);
        add(txt_nom);
        txt_nom.setBounds(110, 110, 270, 30);
        add(txt_dir);
        txt_dir.setBounds(110, 140, 270, 50);
        add(txt_tel);
        txt_tel.setBounds(440, 140, 140, 20);

        jLabel4.setText("Cedula");
        add(jLabel4);
        jLabel4.setBounds(390, 110, 50, 20);

        txt_id.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txt_idKeyTyped(evt);
            }
        });
        add(txt_id);
        txt_id.setBounds(440, 110, 140, 20);

        bt_mod.setText("Crea-Modificar Cliente");
        bt_mod.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_modActionPerformed(evt);
            }
        });
        add(bt_mod);
        bt_mod.setBounds(600, 100, 140, 30);

        jLabel6.setText("Desc.");
        add(jLabel6);
        jLabel6.setBounds(550, 430, 50, 20);

        txt_porDesc.setText("0");
        txt_porDesc.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        txt_porDesc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txt_porDescActionPerformed(evt);
            }
        });
        txt_porDesc.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                txt_porDescKeyReleased(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txt_porDescKeyTyped(evt);
            }
        });
        add(txt_porDesc);
        txt_porDesc.setBounds(600, 430, 40, 20);

        bt_hist.setText("Historia de Ventas");
        bt_hist.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_histActionPerformed(evt);
            }
        });
        add(bt_hist);
        bt_hist.setBounds(600, 130, 140, 30);

        bt_ap.setText("Aderir Producto");
        bt_ap.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_apActionPerformed(evt);
            }
        });
        add(bt_ap);
        bt_ap.setBounds(40, 380, 150, 30);

        bt_borrar.setText("Borrar Articulo");
        bt_borrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_borrarActionPerformed(evt);
            }
        });
        add(bt_borrar);
        bt_borrar.setBounds(190, 380, 110, 30);

        jLabel14.setForeground(new java.awt.Color(255, 153, 0));
        jLabel14.setText("Creacion");
        add(jLabel14);
        jLabel14.setBounds(210, 30, 70, 40);

        jLabel13.setFont(new java.awt.Font("Stencil", 1, 36));
        jLabel13.setForeground(new java.awt.Color(153, 0, 0));
        jLabel13.setText("NOTA DE VENTA");
        add(jLabel13);
        jLabel13.setBounds(30, 10, 310, 45);

        lbl_vend.setForeground(new java.awt.Color(204, 0, 0));
        lbl_vend.setText("Vendedor");
        add(lbl_vend);
        lbl_vend.setBounds(610, 170, 70, 20);

        txt_vend.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txt_vendKeyTyped(evt);
            }
        });
        add(txt_vend);
        txt_vend.setBounds(670, 170, 70, 20);

        ck_desc.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
        ck_desc.setMargin(new java.awt.Insets(0, 0, 0, 0));
        ck_desc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ck_descActionPerformed(evt);
            }
        });
        add(ck_desc);
        ck_desc.setBounds(740, 430, 20, 20);

        txt_desc.setEditable(false);
        txt_desc.setHorizontalAlignment(javax.swing.JTextField.LEFT);
        txt_desc.setText("0.00");
        txt_desc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txt_descActionPerformed(evt);
            }
        });
        txt_desc.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                txt_descKeyReleased(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txt_descKeyTyped(evt);
            }
        });
        add(txt_desc);
        txt_desc.setBounds(640, 430, 100, 20);

        txt_codFac.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txt_codFacActionPerformed(evt);
            }
        });
        txt_codFac.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txt_codFacKeyPressed(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txt_codFacKeyTyped(evt);
            }
        });
        add(txt_codFac);
        txt_codFac.setBounds(160, 80, 130, 30);

        btn_BuscaFac.setText("Buscar");
        btn_BuscaFac.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_BuscaFacActionPerformed(evt);
            }
        });
        add(btn_BuscaFac);
        btn_BuscaFac.setBounds(290, 80, 90, 30);

        btn_anulaFac.setText("Anular");
        btn_anulaFac.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_anulaFacActionPerformed(evt);
            }
        });
        add(btn_anulaFac);
        btn_anulaFac.setBounds(40, 480, 90, 30);

        txt_motAnula.setColumns(20);
        txt_motAnula.setRows(3);
        txt_motAnula.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jScrollPane2.setViewportView(txt_motAnula);

        add(jScrollPane2);
        jScrollPane2.setBounds(40, 410, 470, 70);
        add(lbl_fechaAnulacion);
        lbl_fechaAnulacion.setBounds(620, 50, 100, 20);

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
        jPanel1.setLayout(null);

        lbl_f.setFont(new java.awt.Font("Tahoma", 1, 12));
        lbl_f.setText("Fecha Emision:");
        jPanel1.add(lbl_f);
        lbl_f.setBounds(10, 10, 88, 15);

        jLabel10.setFont(new java.awt.Font("Tahoma", 1, 12));
        jLabel10.setText("Fecha Anulacion:");
        jPanel1.add(jLabel10);
        jLabel10.setBounds(10, 30, 120, 20);

        lbl_fecha.setFont(new java.awt.Font("MS Sans Serif", 0, 12));
        jPanel1.add(lbl_fecha);
        lbl_fecha.setBounds(120, 10, 170, 20);

        lbl_anulacion.setBackground(new java.awt.Color(255, 255, 255));
        lbl_anulacion.setFont(new java.awt.Font("Microsoft Sans Serif", 0, 12));
        jPanel1.add(lbl_anulacion);
        lbl_anulacion.setBounds(130, 30, 100, 20);

        add(jPanel1);
        jPanel1.setBounds(440, 30, 300, 60);

        txt_subCosot.setText("0.00");
        add(txt_subCosot);
        txt_subCosot.setBounds(359, 490, 150, 20);

        lbl_fact.setEditable(false);
        add(lbl_fact);
        lbl_fact.setBounds(130, 80, 150, 30);
    }// </editor-fold>//GEN-END:initComponents
        
    private void txt_descKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_descKeyReleased
// TODO add your handling code here:
        actualizoTotales();
    }//GEN-LAST:event_txt_descKeyReleased
    
    private void txt_porDescKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_porDescKeyReleased
// TODO add your handling code here:
        actualizoTotales();
    }//GEN-LAST:event_txt_porDescKeyReleased
    
    private void txt_porDescActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txt_porDescActionPerformed
// TODO add your handling code here:
        actualizoTotales();
        
    }//GEN-LAST:event_txt_porDescActionPerformed
    
    private void ck_descActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ck_descActionPerformed
// TODO add your handling code here:
        
        if(ck_desc.isSelected()){
            txt_porDesc.setText("%");
            txt_desc.setText("0");
            txt_porDesc.setEditable(false);
            txt_desc.setEditable(true);
            
        }else{
            txt_porDesc.setText("0");
            txt_desc.setText("0");
            txt_porDesc.setEditable(true);
            txt_desc.setEditable(false);
        }
        actualizoTotales();
    }//GEN-LAST:event_ck_descActionPerformed
    
    private void txt_vendKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_vendKeyTyped
// TODO add your handling code here:
        int presiona=evt.getKeyChar();
        if(presiona==10){
            String clave=txt_vend.getText();
            ResultSet resp=conexion.consultarBase("select * from usuario where clave='"+clave+"'");
            try {
                resp.beforeFirst();
                resp.next();
                String nombre=resp.getString(2);
                lbl_vend.setText(nombre);
                
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(this,"Hay un error en la clave","Informacion",JOptionPane.INFORMATION_MESSAGE);
            }
            
        }
        txt_vend.setText("");
    }//GEN-LAST:event_txt_vendKeyTyped
    
    private void bt_borrarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_borrarActionPerformed
// TODO add your handling code here:
    borrPro();
}//GEN-LAST:event_bt_borrarActionPerformed
    public void borrPro(){
        int fila=tabla.getSelectedRow();
        //System.out.println("La fila Seleccionada es:"+fila);
        if(fila==-1){
            JOptionPane.showMessageDialog(this,"Seleccione almenos un articulo para Borrarlo","Informacion",JOptionPane.INFORMATION_MESSAGE);
        } else {
            for(int i=0;i<5;i++){
                
                tabla.setValueAt(null,fila,i);
                
            }
            
        }
        actualizoTotales();
    }
    
    
    
    private void formKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_formKeyReleased
// TODO add your handling code here:
        System.out.println(evt.getKeyCode());
    }//GEN-LAST:event_formKeyReleased
    
    private void bt_apActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_apActionPerformed
// TODO add your handling code here:
    addProd();
}//GEN-LAST:event_bt_apActionPerformed
    public void addProd(){
     tabla.clearSelection();
     b.setVisible(true);
    }
    
    
    
    private void bt_histActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_histActionPerformed
// TODO add your handling code here:
        muestraHist();
        
}//GEN-LAST:event_bt_histActionPerformed
    public void muestraHist(){    
            VerFacturas v=new VerFacturas(conexion, bodega,user);
    }
    
    String textoIngresado="";
    private void txt_porDescKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_porDescKeyTyped
// TODO add your handling code here:
        int press=evt.getKeyChar();
        if(press==10){
            actualizoTotales();
        }
        //parte utilizada  para solo dejar ingrsar numeros 
        char c = evt.getKeyChar();
        if (!(Character.isDigit(c) || (c == java.awt.event.KeyEvent.VK_BACK_SPACE) || (c == java.awt.event.KeyEvent.VK_DELETE))&& c!='.') {
              getToolkit().beep();
              evt.consume();
        }
    }//GEN-LAST:event_txt_porDescKeyTyped
        
    private void formKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_formKeyTyped
// TODO add your handling code here:
        System.out.println(evt.getKeyChar());
    }//GEN-LAST:event_formKeyTyped
    
    private void bt_modActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_modActionPerformed
// TODO add your handling code here:
    cmCliente();
    }//GEN-LAST:event_bt_modActionPerformed
    public void cmCliente(){
        CreaCliente cc=new CreaCliente(conexion, txt_id.getText(),this,user);
    }
    
    
    
    private void txt_idKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_idKeyTyped
        //valido que no puedan ingresar mas que numeros
        char c = evt.getKeyChar();
        if (!(Character.isDigit(c) || (c == java.awt.event.KeyEvent.VK_BACK_SPACE) || (c == java.awt.event.KeyEvent.VK_DELETE))) {
              getToolkit().beep();
              evt.consume();
        }
        int press=evt.getKeyChar();
        
        String textoV=this.txt_id.toString();
        if(!(textoV.length()>13)){
         evt.consume();
        }
        //Limpio si escribes otro codigo
        txt_nom.setText("");
        txt_tel.setText("");
        txt_dir.setText("");
        
        //Si es Enter:
        
        if(press==10){
//        bt_mod.setVisible(true);
            ResultSet r;
            String codigo=txt_id.getText();
            codigo=codigo.replaceAll(" ","");
            
            //Consulto si es que Existe el Cliente:
            r=conexion.consultarBase("select nombre,apellido,direccion,telefono from cliente where cod_cliente like '"+codigo+"'");
            String cod,cli,nom,ape,dir,tel;
            
            try{
                //***************************************
                //En el caso de que el cliente no exista:
                r.last();
                int filas=r.getRow();
                if(filas==0){
                    System.out.println("Cliente no existe");
                    CreaCliente cc=new CreaCliente(conexion, txt_id.getText(),this,user);
                } else{
                    //***************************************
                    //En el caso de que el cliente exista:
                    r.beforeFirst();
                    while(r.next()){
                        nom=r.getString(1);
                        ape=r.getString(2);
                        dir=r.getString(3);
                        tel=r.getString(4);
                        
                        txt_nom.setText(nom+" "+ape);
                        txt_dir.setText(dir);
                        txt_tel.setText(tel);
                    }
                }
            }catch(SQLException sqle){
                System.out.println("Error Consulta Cliente");
                System.err.println(sqle);
            }
            
        }
        
    }//GEN-LAST:event_txt_idKeyTyped
    
    private void bt_limpiarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_limpiarActionPerformed
// TODO add your handling code here:
        limpiar();
        
}//GEN-LAST:event_bt_limpiarActionPerformed
    public void cargaVendedor(Usuario user){
        lbl_vend.setText(user.nombre);
    }
    
    
    public void limpiar(){
        silimpio=true;
        //Limpio Tabla
        int filas=tabla.getRowCount();
        int cont=0;
        while(cont<filas){
            try{
                for(int i=0;i<5;i++){
                    //System.out.println("valor fila:"+cont+" columnas: "+i);
                    tabla.setValueAt(null,cont,i);
                    // System.out.println(toma);
                }
            }catch(Exception e){};
            cont++;
        }
        //Limpio de texto
        txt_tot.setText("0.00");
        txt_desc.setText("0.00");
        txt_vend.setText("");
        //limpio porcentajes:
        txt_porDesc.setText("0");
        //txt_porIva.setText("0");
        //Otro panel
        txt_id.setText("");
        txt_nom.setText("");
        txt_dir.setText("");
        txt_tel.setText("");
        txt_subCosot.setText("0.00");
        cargaVendedor(user);
        int n=numeroFactura();
        cargaNombreTab(n);
        
        silimpio=false;
    }
    
    public void cargaNombreTab(int numero){
            System.out.println("Numero Nota de Venta Generado: "+numero);
            lbl_fact.setText(String.valueOf(numero));
            //Refresco el Tab y le pongo el numero de Factura Nuevo:
            
            int seleccion=tp_controles.getSelectedIndex();
            System.out.println("Repone el numero del TABBBB"+" Tab Seleccionado:"+seleccion);
            if(seleccion!=0){
            String[] titulo=tp_controles.getTitleAt(seleccion).split("#");
            tp_controles.setTitleAt(seleccion,titulo[0]+"#"+String.valueOf(numero));
            }
    
    
    }
    
    
    
    public int numeroFactura(){
        int numeroFactura=0;
        try{
            ResultSet codInicioSri=conexion.consultarBase("select max(num_secuencia) from tipo_comprobante where nombre='Nota de Venta'");
            codInicioSri.next();
            ResultSet r=conexion.consultarBase("select MAX(cod_pedido) from pedido where tipo_comprobante='N'");
            r.next();
            int numero=r.getInt(1);
            int numeroSri=codInicioSri.getInt(1);
            if(numero==0 || numero<numeroSri){
               numero= numeroSri;
            }else{
                numero+=1;
            }
            
            numeroFactura=numero;
        } catch(java.sql.SQLException e){};
        System.out.println("El numero Generado:"+numeroFactura);
        return numeroFactura;
    }
    public void bt_registraActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_registraActionPerformed
    aplastoRegistrar();
    }//GEN-LAST:event_bt_registraActionPerformed
    @Action
    public void aplastoRegistrar(){
    int opccion=0;
        opccion=JOptionPane.showConfirmDialog(this,"Seguro Desea Guardar esta Factura?","Alerta",0);
        if(opccion==0){
            int numFact=Integer.parseInt(lbl_fact.getText());
            FPagoAdmin fpa=new FPagoAdmin(this,conexion,numFact,user);
            
        }
    }
    String NombreRS="";
    String RucEmisor="";
    String DireccionLocal="";
    String AutSRI="";
    String FechaCaducidad="";
    String NombreDueno="";
    public  void obtenParmetros(){
        java.util.Vector vec=conexion.consulta("select * from parametros limit 1");
        java.util.Vector vecInterno=new java.util.Vector();
        for(int i=0;i<vec.size();i++){
            vecInterno=(java.util.Vector)vec.elementAt(i);
                NombreRS=vecInterno.elementAt(1).toString();
                NombreDueno=vecInterno.elementAt(8).toString();
                RucEmisor=vecInterno.elementAt(2).toString();
                DireccionLocal=vecInterno.elementAt(3).toString();
                AutSRI=vecInterno.elementAt(6).toString();
                FechaCaducidad=vecInterno.elementAt(7).toString();
        }
    }
    public String recuperaTerminal(String codSucursal,String mac){
        String consultaTerminal="select t.cod_terminales "+
                                "from   bodega b,terminales t "+
                                "where  b.cod_bodega=t.cod_bodega and identificador like '"+mac+"' and b.cod_bodega="+codSucursal+" limit 1";
        String terminal="";
        java.util.Vector vec=conexion.consulta(consultaTerminal);
        java.util.Vector vecInt=new java.util.Vector();
        for(int i=0;i<vec.size();i++){
            vecInt=(java.util.Vector)vec.elementAt(i);
            terminal=vecInt.elementAt(0).toString();
        }
        return terminal;
    }
    public void asientoEfectivo(String subTotal,String Iva){
            String numeroDiario=numeroDiario();
            this.asiento(numeroDiario,lbl_fecha.getText(),"Asiento de Nota # N_"+lbl_fact.getText());
            String numeroAsiento=numeroAsiento();
            asientoDeatlle(numeroAsiento,numeroDiario,"1","1","1","0",txt_tot.getText(),"0");  //Asiento de Caja  debe
            asientoDeatlle(numeroAsiento,numeroDiario,"7","1","4","0",txt_desc.getText(),"0");  //Descuento       debe
            asientoDeatlle(numeroAsiento,numeroDiario,"1","1","5","0","0",subTotal);  //Ventas           haber
            asientoDeatlle(numeroAsiento,numeroDiario,"3","1","2","0","0",Iva);  //Iva en Ventas  haber
    }
    public void asientoCuentasCobrar(String subTotal,String Iva){
            String numeroDiario=numeroDiario();
            this.asiento(numeroDiario,lbl_fecha.getText(),"Asiento de Nota # N_"+lbl_fact.getText());
            String numeroAsiento=numeroAsiento();
            asientoDeatlle(numeroAsiento,numeroDiario,"3","1","1","0",txt_tot.getText(),"0");  //Asiento Cuentas x Cobrar
            asientoDeatlle(numeroAsiento,numeroDiario,"7","1","4","0",txt_desc.getText(),"0");  //Descuento       debe
            asientoDeatlle(numeroAsiento,numeroDiario,"1","1","5","0","0",subTotal);  //Ventas           haber
            asientoDeatlle(numeroAsiento,numeroDiario,"3","1","2","0","0",Iva);  //Iva en Ventas  haber
    }
    public void asientoCuentasCreadito(String subTotal,String Iva){
            String numeroDiario=numeroDiario();
            this.asiento(numeroDiario,lbl_fecha.getText(),"Asiento de Nota # N_"+lbl_fact.getText());
            String numeroAsiento=numeroAsiento();
            asientoDeatlle(numeroAsiento,numeroDiario,"6","1","2","0",txt_tot.getText(),"0");  //Asiento Cuentas x Cobrar
            asientoDeatlle(numeroAsiento,numeroDiario,"7","1","4","0",txt_desc.getText(),"0");  //Descuento       debe
            asientoDeatlle(numeroAsiento,numeroDiario,"1","1","5","0","0",subTotal);  //Ventas           haber
            asientoDeatlle(numeroAsiento,numeroDiario,"3","1","2","0","0",Iva);  //Iva en Ventas  haber
    }        
    public void asientoCostos(){
            String numeroDiario=numeroDiario();
            this.asiento(numeroDiario,lbl_fecha.getText(),"Asiento de Nota # NC_"+lbl_fact.getText());
            String numeroAsiento=numeroAsiento();
            asientoDeatlle(numeroAsiento,numeroDiario,"13","1","4","0",txt_subCosot.getText(),"0");   //Asinto cosotos
            asientoDeatlle(numeroAsiento,numeroDiario,"5","1","1","0","0",txt_subCosot.getText());   //inventario de mercaderias
    }
    public void asientoAnula(String cod_Comprobante){
            String consulta="select d.cod_tercernivel,d.cod_segundonivel,d.cod_primernivel,d.debe,d.haber,ass.referencia "+
                            "from dtl_asiento d,tercernivel t,asiento ass "+
                            "where t.cod_tercernivel=d.cod_tercernivel "+
                            "and t.cod_segundonivel=d.cod_segundonivel "+
                            "and t.cod_primernivel=d.cod_primernivel and "+
                            "ass.cod_asiento=d.cod_asiento and "+
                            "ass.referencia like '%N_"+cod_Comprobante+"%'";
            java.util.Vector vecPrincipal=conexion.consulta(consulta);
            java.util.Vector vecInterno=new java.util.Vector();
            String numeroDiario=numeroDiario();
            asiento(numeroDiario,fecha,"Anulacion de Nota # "+txt_codFac.getText());
            String numeroAsiento=numeroAsiento();
            for(int i=0;i<vecPrincipal.size();i++){
                vecInterno=(java.util.Vector)vecPrincipal.elementAt(i);
                asientoDeatlle(numeroAsiento,numeroDiario,vecInterno.elementAt(0).toString(),vecInterno.elementAt(1).toString(),vecInterno.elementAt(2).toString(),"0",vecInterno.elementAt(4).toString(),vecInterno.elementAt(3).toString());   //Iva en Ventas  haber
            }
    }
    public void asientoAnulaCosto(String cod_Comprobante){
            String consulta="select d.cod_tercernivel,d.cod_segundonivel,d.cod_primernivel,d.debe,d.haber,ass.referencia "+
                            "from dtl_asiento d,tercernivel t,asiento ass "+
                            "where t.cod_tercernivel=d.cod_tercernivel "+
                            "and t.cod_segundonivel=d.cod_segundonivel "+
                            "and t.cod_primernivel=d.cod_primernivel and "+
                            "ass.cod_asiento=d.cod_asiento and "+
                            "ass.referencia like '%NC_"+cod_Comprobante+"%'";
            java.util.Vector vecPrincipal=conexion.consulta(consulta);
            java.util.Vector vecInterno=new java.util.Vector();
            String numeroDiario=numeroDiario();
            asiento(numeroDiario,fecha,"Anulacion de Nota # "+txt_codFac.getText());
            String numeroAsiento=numeroAsiento();
            for(int i=0;i<vecPrincipal.size();i++){
                vecInterno=(java.util.Vector)vecPrincipal.elementAt(i);
                asientoDeatlle(numeroAsiento,numeroDiario,vecInterno.elementAt(0).toString(),vecInterno.elementAt(1).toString(),vecInterno.elementAt(2).toString(),"0",vecInterno.elementAt(4).toString(),vecInterno.elementAt(3).toString());   //Iva en Ventas  haber
            }
    }
    public String numeroDiario(){
         String numero=""; 
         try{
            java.sql.ResultSet r=conexion.consultarBase("select  cod_diario from diario where fecha_diario=(select max(fecha_diario) from diario) limit 1");
            r.next();
            numero=r.getString(1);
          }catch(SQLException f){}
         return numero;
    }
    public String numeroAsiento(){
         String numero=""; 
         try{
            java.sql.ResultSet r=conexion.consultarBase("select max(cod_asiento) from asiento");
            r.next();
            numero=r.getString(1);
          }catch(SQLException f){}
         return numero;
    }
    public void asiento(String numeroDiario,String fecha,String referencia){
        conexion.insertarDatos("insert into asiento(cod_diario,fecha_dia,referencia) values("+numeroDiario+",'"+fecha+"','"+referencia+"')");
    }
    public void asientoDeatlle(String numeroAsiento,String numeroDiario,String n3,String n2,String n1,String parcial,String debe,String haber){
        String consultaDtlAs= "insert into dtl_asiento "+
                              "(cod_diario,cod_asiento,cod_tercernivel,cod_segundonivel,cod_primernivel,parcial,debe,haber) " +
                              "values ("+numeroDiario+","+numeroAsiento+","+n3+","+n2+","+n1+","+parcial+","+debe+","+haber+")";
        conexion.insertarDatos(consultaDtlAs);
    }
    
    MacAddress macA=new MacAddress();
    public void registrarFactura(String documento,int orig,int tipoPago){
        //Inicio la Transaccion de Insercion de Facturas:
        conexion.consultarBase("START TRANSACTION;");
        numeroFactura();
        int original=orig;
        String Doc=documento;
        if(!txt_id.getText().equals("")&&!txt_tot.getText().equals("0.0")){
             Imprimir TrabImpresion=new Imprimir(String.valueOf(bodega),terminal,this.lbl_fact.getText(),txt_id.getText().toString(),txt_nom.getText().toString(),txt_tel.getText().toString(),txt_dir.getText().toString(),"Nota de Venta",NombreRS,NombreDueno,RucEmisor,DireccionLocal,AutSRI,FechaCaducidad);
            transaccionesErradas TrabImpresionErrada=new transaccionesErradas(String.valueOf(bodega),terminal,this.lbl_fact.getText(),txt_id.getText().toString(),txt_nom.getText().toString(),txt_tel.getText().toString(),txt_dir.getText().toString(),"Nota de Venta",NombreRS,NombreDueno,RucEmisor,DireccionLocal,AutSRI,FechaCaducidad);
            
            //inserto cabecera factura;
            
            String hora=new java.sql.Time(System.currentTimeMillis()).toString();
            String fecha=new java.sql.Date(System.currentTimeMillis()).toString();
            System.out.println("@@@ Ingreso la cabecera de factura  @@@");
            conexion.insertarDatos("insert into pedido values("+lbl_fact.getText()+",'"+txt_id.getText()+"','"+txt_dir.getText()+"','"+fecha+"','Cuenca','Ecuador','Azuay','"+txt_tel.getText()+"','"+lbl_vend.getText()+"',"+txt_tot.getText()+","+String.valueOf(porcentajer)+","+txt_desc.getText()+",0,'A',null,'','N','"+String.valueOf(bodega)+"','"+terminal+"',"+AutSRI+")");
            System.out.println("@@@FIN Ingreso la cabecera de factura  @@@");
            
             //Inserto detalle factura;
            if(tipoPago==0){ //Cliente pago en efectivo
               asientoEfectivo(String.valueOf(nf.format(subTotalTodo).replaceAll(",",".")),String.valueOf(nf.format(total_Iva).replaceAll(",",".")));
               asientoCostos();
            }else if(tipoPago==1){ //Cuentas x Cobrar
               asientoCuentasCobrar(String.valueOf(nf.format(subTotalTodo).replaceAll(",",".")),String.valueOf(nf.format(total_Iva).replaceAll(",",".")));
               asientoCostos();
            }else if(tipoPago==2){
                asientoCuentasCreadito(String.valueOf(nf.format(subTotalTodo).replaceAll(",",".")),String.valueOf(nf.format(total_Iva).replaceAll(",",".")));
                asientoCostos();
            }
            
            //Inserto detalle factura;
            int filas=tabla.getRowCount();
            int cont=0;
            
            int NumProductos=cuentaProductos();
            int ProdVerificados=0;
            
            //Inserto los titulos de la Factura:
              TrabImpresion.escriboFact(TrabImpresion.pongoTitulos(""));
              TrabImpresionErrada.escriboFact(TrabImpresionErrada.pongoTitulos(""));
            while(cont<filas){
                System.out.println("Comienza el while");
                try{
                    String codigoPro=tabla.getValueAt(cont,0).toString();
                    String cantProVendido=tabla.getValueAt(cont,1).toString();
                    String subTot=tabla.getValueAt(cont,4).toString();

                    //Inserto detalle en el archivo de Impresion:
                    TrabImpresion.insertoDetImp(codigoPro,tabla.getValueAt(cont,2).toString(),cantProVendido,tabla.getValueAt(cont,3).toString(),subTot);
                    TrabImpresionErrada.insertoDetImp(codigoPro,tabla.getValueAt(cont,2).toString(),cantProVendido,tabla.getValueAt(cont,3).toString(),subTot);
                    //Realizo la Insercion del los Producto que conforman el detalle:
                    //if(!esCombo(codigoPro)){
                    //En el caso de que no sea un Combo:
                    System.out.println("@@@  Ingreso Detalle Factura ----- @@@");
                    conexion.insertarDatos("insert into dtl_pedido values("+lbl_fact.getText()+",'"+codigoPro/*Codigo*/+"',"+cantProVendido/*Cantidad*/+","+subTot/*Subtotal*/+",'N')");
                    System.out.println("@@@ FIN Ingreso Detalle Factura ----- @@@");
                    
                    System.out.println(" El dato con null es*"+codigoPro+"**"+cantProVendido+"*");
                    boolean actualizacionVer=actualizoStock(codigoPro,Integer.parseInt(cantProVendido));
                    
                    //Verifico Insercion del Detalle:
                    boolean detalleVerific=false;
                    ResultSet rsverific=conexion.consultarBase("SELECT * FROM dtl_pedido where cod_pedido="+lbl_fact.getText()+" and cod_producto='"+codigoPro+"' and cantidad="+cantProVendido+" and subtotal="+subTot+";");
                    if(conexion.obtenerFilas(rsverific)>0){
                        detalleVerific=true;
                    }
                    //Verifico El Ingreso del detalle y la actualizacion del Producto:
                    if(actualizacionVer&&detalleVerific){
                        ProdVerificados++;
                    }
                }catch(Exception e){}
                cont++;
            }
            //Verifico que todos los producto se han verificado:
            if (NumProductos==ProdVerificados){
                
                
                //Insercion Verificada
                //###################################
                conexion.consultarBase("COMMIT;");
                //###################################
                //Introdusco Total en el archivo a Imprimir:
                String Pie=TrabImpresion.pieFactura("0",txt_desc.getText().toString(),"0",txt_tot.getText().toString());
                TrabImpresion.escriboFact(Pie);
                TrabImpresionErrada.getArchivo().borrarArchivo(TrabImpresionErrada.getArchivo().sacoFile());
                //Guardo el Trabajo para la Copia
                Archivo archivoCopia=TrabImpresion.getArchivo();
                //Introdusco el Original.
                //Introdusco el Original.
                String Etiqueta="BLANCO : ADQUIRIENTE \n" +
                                "COLOR  : EMISOR      \n\n\n\n\n\n";
                TrabImpresion.escriboFact(Etiqueta);                
                //Imprimo:
                TrabImpresion.realizaImprecion();

                //---------------------------------------------
                //Para el caso que se necesite una copia:
                /*int opccion=0;
                opccion=JOptionPane.showConfirmDialog(this,"Desea Imprimir una Copia?","Alerta",0);
                if(opccion==0){
                    //Reemplazo el texto que dice copia por el nuevo texto del archivo
                    Archivo archivo=TrabImpresion.getArchivo();
                    archivo.removeLineFromFile(TrabImpresion.archNom,"           ** Original **","           ** Copia **");
                    TrabImpresion.realizaImprecion();
                     //Le regreso como estaba al principio
                    archivo.removeLineFromFile(TrabImpresion.archNom,"           ** Copia **","           ** Original **");
                    
                }*/
               
                //cerrarTab();
                limpiar();
                conexion.limpiar(tabla);
                
                
            }else{
                //Se dio un problema al guardar o actualizar los productos de la factura:
                TrabImpresion.getArchivo().borrarArchivo(TrabImpresion.getArchivo().sacoFile());
                try {
                    //Se dio un problema al guardar o actualizar los productos de la factura:
                    String Pies=TrabImpresionErrada.pieFactura("0",txt_desc.getText().toString(),"0",txt_tot.getText().toString());
                    TrabImpresionErrada.escriboFact(Pies);
                    //TrabImpresionErrada.realizaImprecion();

                } catch (Exception ex) {
                    Logger.getLogger(Facturacion.class.getName()).log(Level.SEVERE, null, ex);
                }
                conexion.consultarBase("ROLLBACK;");
                JOptionPane.showMessageDialog(this,"LA FACTURA NO SE GRABO DEBIDO A ALGUN PROBLEMA  EN LA ACTUALIZACION DE LOS PRODUCTOS O EN LA INSERCION DE LOS DETALLES  ","Informacion",JOptionPane.INFORMATION_MESSAGE);
            }
            
            
        }else{
            JOptionPane.showMessageDialog(this,"Complete todos los datos de la factura","Informacion",JOptionPane.INFORMATION_MESSAGE);
            
        }
        
        
    }
    
    @Action
    public void cerrarTab(){
      int seleccion=aviewer.tp_controles.getSelectedIndex();
      if(seleccion==0){
      
      }else{
      aviewer.tp_controles.remove(aviewer.tp_controles.getComponentAt(seleccion));
      aviewer.ventanas.remove(seleccion-1);
      }
      
    }
    
    public boolean esCombo(String cod){
        boolean val=false;
        //Verifico si el Combo Existe.
        ResultSet resp;
        resp=conexion.consultarBase("select * from combo where cod_combo like '"+cod+"'");
        int filasIn=conexion.obtenerFilas(resp);
        if(filasIn>0){
            val=true;
        }
        
        return val;
    }
    
    
    
    
    public boolean actualizoStock(String cod,int cant){
    boolean insercionVerific=false;    
        try{
            //Actualizo datos del Stock:
            
            //Saco el numero Stock
            System.out.println("*************************************");
            ResultSet r=conexion.consultarBase("select b.cantidad  from producto i, itm_bodega b where i.cod_producto like b.cod_producto and i.cod_producto like '"+cod+"' and cod_bodega="+bodega);
            //  System.out.println("Logra la consulta::::");
            r.next();
            int numeroStock=r.getInt(1);
            //  System.out.println("El codigo es:"+numeroStock);
            int stock=numeroStock-cant;
            
            //Actualizo el numero
            //System.out.println("Actualiza los datos del Item: "+cod+" de: "+numeroStock+" a:"+stock);
            conexion.insertarDatos("update itm_bodega set cantidad="+stock+" where cod_producto like '"+cod+"' and cod_bodega="+bodega);
            
            //Verifico la Actualizacion: (Verifico la Transaccion se realice exitosamente para este producto)
            r=conexion.consultarBase("select b.cantidad  from producto i, itm_bodega b where i.cod_producto like b.cod_producto and i.cod_producto like '"+cod+"' and cod_bodega="+bodega);
            r.next();
            int numeroActual=r.getInt(1);
            if(numeroActual==stock){
                //Transaccion Verificada!:
                insercionVerific=true;
            }
            
            //Actualizo Total en los productos de las diferentes bodegas
            int tot=0;
            ResultSet respuesta=conexion.consultarBase("select sum(cantidad) from itm_bodega where cod_producto like '"+cod+"'");
            respuesta.next();
            tot= respuesta.getInt(1);
            conexion.insertarDatos("UPDATE producto SET stock_total= "+tot+" where cod_producto like '"+cod+"'");
            
            //ACTUALIZO INVENTARIO ABIERTO ###################
            //Realizo la actualizacion en el producto del inventario Abierto:
            ResultSet rInv=conexion.consultarBase("SELECT idInventario FROM inventario where abierto=true;");
            System.out.println("REALIZO ACTUALIZACION INVENTARIO");
            System.out.println("INVENTARIO?");
            System.out.println("SELECT idInventario FROM inventario where abierto=true;"+conexion.obtenerFilas(rInv));
            if(conexion.obtenerFilas(rInv)>0){
                System.out.println("Entra en INVENTARIO");
                rInv.beforeFirst();
                rInv.next();
                int codigoInv=rInv.getInt(1);
                System.out.println(" INVENTARIO ABIERTO="+codigoInv);
                //Busco este producto dentro del Inventario:
                ResultSet rPro=conexion.consultarBase("SELECT cantidad_act,cantidad_cont FROM productoinv where cod_inv="+codigoInv+" and cod_producto like '"+cod+"';");
                System.out.println("PRODUCTO?");
                if(conexion.obtenerFilas(rPro)>0){
                System.out.println("PRODUCTO INVENTARIO MOD="+cod);    
                rPro.beforeFirst();
                rPro.next();
                //Valido el cambio de que no sea menor a cero
                int cantAct=cant;
                int cantCont=cant;
                if(rPro.getInt(1)<cantAct){cantAct=0;}
                if(rPro.getInt(2)<cantCont){cantCont=0;}
                
                
                //Actualizo la Cantidad del producto del Inventario:
                  conexion.insertarDatos("UPDATE productoinv SET cantidad_act=cantidad_act-"+cantAct+", cantidad_cont=cantidad_cont-"+cantCont+" where cod_producto like '"+cod+"';");  
                    
                }else{
                //Este producto fue creado recientemente y no esta dentro de los productos del inventario Abierto:
                   ResultSet rProNuevo=conexion.consultarBase("SELECT cod_producto,cod_categoria,nombre,descripcion,precio_costo,precio_normal,stock_total,precio_distribucion FROM producto p where cod_producto like '"+cod+"';");
                   rProNuevo.beforeFirst();
                   rProNuevo.next();
                   conexion.insertarDatos("insert into prductoinv values("+codigoInv+",'"+rProNuevo.getInt(1)+"','"+rProNuevo.getInt(2)+"','"+rProNuevo.getString(3)+"','"+rProNuevo.getString(4)+"',"+rProNuevo.getDouble(5)+","+rProNuevo.getDouble(6)+","+rProNuevo.getInt(7)+",0,"+rProNuevo.getDouble(8)+");");
                }
                
            }
            //################################################
            
            
        
        } catch(java.sql.SQLException e){System.out.println("Error Actualizacion");};
        //inserto cabecera factura;
        
        
        
        return insercionVerific;
    }
    private void tablaInputMethodTextChanged(java.awt.event.InputMethodEvent evt) {//GEN-FIRST:event_tablaInputMethodTextChanged
// TODO add your handling code here:
    }//GEN-LAST:event_tablaInputMethodTextChanged
    
    private void formMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMouseEntered
// TODO add your handling code here:
    }//GEN-LAST:event_formMouseEntered

private void txt_descActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txt_descActionPerformed

}//GEN-LAST:event_txt_descActionPerformed

private void txt_descKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_descKeyTyped
        //parte utilizada  para solo dejar ingrsar numeros 
        char c = evt.getKeyChar();
        if (!(Character.isDigit(c) || (c == java.awt.event.KeyEvent.VK_BACK_SPACE) || (c == java.awt.event.KeyEvent.VK_DELETE))&& c!='.') {
              getToolkit().beep();
              evt.consume();
        }
}//GEN-LAST:event_txt_descKeyTyped

private void txt_codFacKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_codFacKeyPressed
    //busqueda de la factura para su posterior  anulacion
   
}//GEN-LAST:event_txt_codFacKeyPressed
JTable tabla1=new JTable(100,5);
private void txt_codFacActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txt_codFacActionPerformed
    
    if(txt_codFac.getText().equals("")){
        limpiaFactura();
        JOptionPane.showMessageDialog(this,"Ingrese el codigo de la Factura","Error",JOptionPane.ERROR_MESSAGE); 
    }else{
       if(conexion.existeCodigo("pedido","cod_pedido",txt_codFac.getText())){
            if(opcionComprobante==1){
                if(conexion.verificaAnulacion(txt_codFac.getText(),"N")==true){
                    cargarFactura(txt_codFac.getText());
                }else{
                    limpiaFactura();
                    JOptionPane.showMessageDialog(this,"La factura no ha sido anulada","Error",JOptionPane.ERROR_MESSAGE); 
                }
            }else{//----------------
                if(conexion.verificaAnulacion(txt_codFac.getText(),"N")==false){
                    cargarFactura(txt_codFac.getText());
                }else{
                    limpiaFactura();
                    JOptionPane.showMessageDialog(this,"La factura ya ha sido anulada","Error",JOptionPane.ERROR_MESSAGE); 
                }
            }
       }else{
           limpiaFactura();
           JOptionPane.showMessageDialog(this,"El codigo de la Factura no existe","Error",JOptionPane.ERROR_MESSAGE); 
           
       }
    }
}//GEN-LAST:event_txt_codFacActionPerformed
//carga la factura una vez que se ingrese el codigo 
public void cargarFactura(String codigoFactura){
    double valor_IvaNota=0;
        jScrollPane1.remove(tabla);
        jScrollPane1.add(tabla1);
        jScrollPane1.setViewportView(tabla1);
        conexion.limpiar(tabla1);
        tabla1.getColumnModel().getColumn(0).setHeaderValue("Codigo");
        tabla1.getColumnModel().getColumn(1).setHeaderValue("Cantidad");
        tabla1.getColumnModel().getColumn(2).setHeaderValue("Articulo");
        tabla1.getColumnModel().getColumn(3).setHeaderValue("PUnitario");
        tabla1.getColumnModel().getColumn(4).setHeaderValue("Total");
        setVisible(true);
        limpiaFactura();
        String consultaCabecera="select c.cod_cliente,c.nombre,c.direccion,c.telefono,p.vendedor_pe,"+
       "p.cod_pedido,p.iva,p.descuento,p.totalNeto,p.total_pagado,p.fecha_pe,p.fecha_anulacion,p.desc_anulacion "+
       "from   cliente c,pedido p,dtl_pedido dtl where  c.cod_cliente=p.cod_cliente and p.cod_pedido=dtl.cod_pedido and p.cod_pedido="+codigoFactura+" and dtl.tipoDoc like 'N'   and p.tipo_comprobante like 'N'  group by p.cod_pedido";
       java.util.Vector consultaCabFac=conexion.consulta(consultaCabecera);
       java.util.Vector consultaCabFacInt=new java.util.Vector();
       for(int i=0;i<consultaCabFac.size();i++){
           consultaCabFacInt=(java.util.Vector)consultaCabFac.elementAt(i);
           txt_id.setText(consultaCabFacInt.elementAt(0).toString());
           txt_nom.setText(consultaCabFacInt.elementAt(1).toString());
           txt_dir.setText(consultaCabFacInt.elementAt(2).toString());
           txt_tel.setText(consultaCabFacInt.elementAt(3).toString());
           txt_vend.setText(consultaCabFacInt.elementAt(4).toString());
           valor_IvaNota=Double.parseDouble(consultaCabFacInt.elementAt(6).toString());
           txt_desc.setText(consultaCabFacInt.elementAt(7).toString());
           txt_tot.setText(consultaCabFacInt.elementAt(9).toString());
           lbl_fecha.setText(consultaCabFacInt.elementAt(10).toString());
           //es debido a que este campo puede tener un valor  nulo
           try{
               lbl_anulacion.setText(consultaCabFacInt.elementAt(11).toString());
           }catch(java.lang.NullPointerException e){}
           txt_motAnula.setText(consultaCabFacInt.elementAt(12).toString());
       }
       String consultaDetalle="select dtl.cod_producto,dtl.cantidad,pr.nombre,precio_normal,dtl.subtotal "+
       "from   cliente c,pedido p,dtl_pedido dtl,producto pr "+
       "where  c.cod_cliente=p.cod_cliente and p.cod_pedido=dtl.cod_pedido and dtl.cod_producto=pr.cod_producto and "+
       "p.cod_pedido="+codigoFactura+" and dtl.tipoDoc like 'N'  and p.tipo_comprobante like 'N' ";
       
       java.util.Vector consultaDetlFac=conexion.consulta(consultaDetalle);
       java.util.Vector consultaDetlFacInt=new java.util.Vector();
       for(int i=0;i<consultaDetlFac.size();i++){
           consultaDetlFacInt=(java.util.Vector)consultaDetlFac.elementAt(i);
//           tabla1.setValueAt(consultaDetlFacInt.elementAt(0).toString(), i,0);
//           String cantidad=consultaDetlFacInt.elementAt(1).toString();
//           tabla1.setValueAt(cantidad, i,1);
//           tabla1.setValueAt(consultaDetlFacInt.elementAt(2).toString(), i,2);
//           String subtotal=consultaDetlFacInt.elementAt(4).toString();
//           String ivaCompleto="1."+Cortar(String.valueOf(valor_IvaNota)); //
//           double subSinIva=Double.parseDouble(subtotal)/Double.parseDouble(ivaCompleto);
//           double precio=subSinIva/Double.parseDouble(cantidad);
//           double precioReal=precio;//Double.parseDouble(consultaDetlFacInt.elementAt(3).toString());
//           double valor_iva=(precioReal*valor_IvaNota)/100;
//           double precio_mas_iva=precioReal+valor_iva;
//           tabla1.setValueAt(String.valueOf(nf.format(precio_mas_iva)), i,3); 
//           tabla1.setValueAt(subtotal, i,4); 

           tabla1.setValueAt(consultaDetlFacInt.elementAt(0).toString(), i,0);
           String cantidad=consultaDetlFacInt.elementAt(1).toString();
           tabla1.setValueAt(cantidad, i,1);
           tabla1.setValueAt(consultaDetlFacInt.elementAt(2).toString(), i,2);
           double precioReal=Double.parseDouble(consultaDetlFacInt.elementAt(3).toString());
           double valor_iva=(precioReal*valor_IvaNota)/100;
           double precio_mas_iva=precioReal+valor_iva;
           tabla1.setValueAt(String.valueOf(nff.format(precio_mas_iva)), i,3); 
           tabla1.setValueAt(consultaDetlFacInt.elementAt(4).toString(), i,4); 
       }
}
//Metodo para limpiar la tabla y  campos, esto solo en el caso de anulacion de factura
public void limpiaFactura(){
           conexion.limpiar(tabla1);
           txt_id.setText("");
           txt_nom.setText("");
           txt_dir.setText("");
           txt_tel.setText("");
           txt_vend.setText("");
           txt_desc.setText("0.00");
           txt_tot.setText("0.00");
           txt_porDesc.setText("%");
           lbl_fecha.setText("");
           txt_motAnula.setText("");
           txt_subCosot.setText("0.00");
           if(opcionComprobante==1){
               lbl_anulacion.setText("");
           }    
}
//metodo para desactivar los controles en caso de anulacion de factura
public void desactivaControles(){
            txt_codFac.setVisible(true);
            btn_BuscaFac.setVisible(true);
            btn_anulaFac.setVisible(true);
            lbl_fact.setVisible(false);
            bt_mod.setVisible(false);
            bt_hist.setVisible(false);
            lbl_vend.setVisible(false);
            txt_vend.setVisible(false);
            bt_ap.setVisible(false);
            bt_borrar.setVisible(false);
            ck_desc.setVisible(false);
            bt_limpiar.setVisible(false);
            bt_registra.setVisible(false);
            txt_porDesc.setEnabled(false);
            tabla1.setEnabled(false);
            txt_id.setEnabled(false);
            lbl_fecha.setText("");
            jLabel10.setVisible(true);
            lbl_anulacion.setVisible(true);
            lbl_anulacion.setText(fecha);
            jScrollPane2.setVisible(true);
            ////
}
public void desaContVisor(){
            btn_anulaFac.setVisible(false);
            txt_motAnula.setEditable(false);
            lbl_anulacion.setText("");
            lbl_fechaAnulacion.setVisible(true);
}
//metodo para la anular la factura
public void  anulaFactura(){
    if(txt_codFac.getText().equals("")){
        JOptionPane.showMessageDialog(this,"Ingrese el codigo de la Factura","Error",JOptionPane.ERROR_MESSAGE); 
    }else{
       if(conexion.existeCodigo("pedido","cod_pedido",txt_codFac.getText())){
           if(conexion.verificaAnulacion(txt_codFac.getText(),"N")==false){
               if(txt_motAnula.getText().equals("")){
                    JOptionPane.showMessageDialog(this,"Debe ingresar el motivo de anulacion","Error",JOptionPane.ERROR_MESSAGE); 
               }else{
                   if(lbl_fecha.getText().compareTo(lbl_anulacion.getText())<=0){
                    int opccion=0;
                    opccion=JOptionPane.showConfirmDialog(this,"Seguro que desea anular esta factura?","Alerta",0);
                    if(opccion==0){
                      try{
                           conexion.consultarBase("START TRANSACTION;");
                           conexion.insertarDatos("update pedido set estato_pe='N',fecha_anulacion='"+lbl_anulacion.getText()+"',desc_anulacion='"+txt_motAnula.getText()+"' where cod_pedido="+txt_codFac.getText()+" and tipo_comprobante like 'N'");
                           String consultaDetalle="select dtl.cod_producto,dtl.cantidad,pr.nombre,precio_normal,dtl.subtotal "+
                           "from  cliente c,pedido p,dtl_pedido dtl,producto pr "+
                           "where  c.cod_cliente=p.cod_cliente and p.cod_pedido=dtl.cod_pedido and dtl.cod_producto=pr.cod_producto and "+
                           "p.cod_pedido="+txt_codFac.getText()+" and dtl.tipoDoc like 'N'   and p.tipo_comprobante like 'N' ";
                           java.util.Vector consultaDetlFac=conexion.consulta(consultaDetalle);
                           java.util.Vector consultaDetlFacInt=new java.util.Vector();
                           for(int i=0;i<consultaDetlFac.size();i++){
                               consultaDetlFacInt=(java.util.Vector)consultaDetlFac.elementAt(i);
                               //se utiliza el menos por que se utiliza el metodo de actualiza stock que es para 
                               //la factura en el cual el stock se resta y en este caso necesitamos sumar
                               actualizoStock(consultaDetlFacInt.elementAt(0).toString(),-Integer.parseInt(consultaDetlFacInt.elementAt(1).toString()));
                           }
                           asientoAnula(txt_codFac.getText());
                           asientoAnulaCosto(txt_codFac.getText());
                           
                           //Anulo las Cuentas x Cobrar o pagar Relacionadas:
                           anuloCuentasRel(txt_codFac.getText());
                           
                           limpiaFactura();
                           txt_codFac.setText("");
                           conexion.consultarBase("COMMIT;");
                       }catch(Exception es){
                           conexion.consultarBase("ROLLBACK;");
                       }
                    }// fin if(opcion)
                  }else{
                        JOptionPane.showMessageDialog(this,"La fecha de anulacion no debe ser menor al de la emision","Error Hora del Sistema",JOptionPane.ERROR_MESSAGE); 
                  }
               }
           }else{
                        JOptionPane.showMessageDialog(this,"La factura ya ha sido anulada ","Error",JOptionPane.ERROR_MESSAGE); 
           }
       }else{
           limpiaFactura();
           JOptionPane.showMessageDialog(this,"El codigo de la Factura no existe","Error",JOptionPane.ERROR_MESSAGE); 
       }
    }  
}

public void anuloCuentasRel(String codigo) {
        ResultSet respuesta = conexion.consultarBase("SELECT * FROM cuentaspendientes where cod_factura like 'N" + codigo + "' and pagado like 'falta';");
        int filas = conexion.obtenerFilas(respuesta);
        if (filas > 0) {
            conexion.actualizarBase("update cuentaspendientes set pagado='Anulado' where cod_factura like 'N" + codigo + "' and pagado like 'falta';");
        }
    }
private void txt_codFacKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_codFacKeyTyped
        char c = evt.getKeyChar();
        if (!(Character.isDigit(c) || (c == java.awt.event.KeyEvent.VK_BACK_SPACE) || (c == java.awt.event.KeyEvent.VK_DELETE))) {
              getToolkit().beep();
              evt.consume();
        }
}//GEN-LAST:event_txt_codFacKeyTyped

private void btn_anulaFacActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_anulaFacActionPerformed
             anulaFactura();
}//GEN-LAST:event_btn_anulaFacActionPerformed

private void btn_BuscaFacActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_BuscaFacActionPerformed
buscarFactura();
}//GEN-LAST:event_btn_BuscaFacActionPerformed
public void buscarFactura(){
      
      if(opcionComprobante==1){ //solo para facturas Anuladas
               listaFacturas listaFac=new listaFacturas(conexion,this,1,user);
               listaFac.setVisible(true);
      }else{
               listaFacturas listaFac=new listaFacturas(conexion,this,0,user);
               listaFac.setVisible(true);
      }    

}    


    class MyTableChangedListener implements TableModelListener {
        public void tableChanged(TableModelEvent evt) {
            
            int row = evt.getFirstRow();
            int column = evt.getColumn();
            Object dato1=tabla.getValueAt(row, column);
            String dato=String.valueOf(dato1);
            dato=dato.replaceAll(" ","");
            
            if(dato!="" &&dato!="null"){
                
                
                if(column==1 ){ //Modifico la columna de Cantidad:
                   cambioCantidad(dato,row);
                }
                
                if(column==0 ){ //Modifico la columna del Codigo:
                    //    System.out.println("**************//Cambio en Tabla*/*/*/***********************");
                    //    System.out.println("Los datos obtenidos son:"+row+column);
                    //    System.out.println("El dato es="+dato);
                    //Cuento la fila desocupada:
                   
                   actualizoSubtotal=false;
                    
                    int linea=siExisteCodigo(dato,row);
                    System.out.println("La linea Obtenida es:"+linea+":"+row);
                    if(linea>=0&&silimpio==false){
                        System.out.println("Si LIMPIO ="+silimpio);
                        mostrarDialogo();
                        tabla.setValueAt(null,row, column);
                        metodoActCant(linea);
                    } else{
                        //Consulta a la base de datos el codigo.
                        System.out.println("Obtengo Valores:"+dato+" "+row);
                        obtengoValores(dato,row);
                        actualizoTotales();
                    }
                    actualizoSubtotal=true;
                }
                if(column==1 && dato!=null){
                    //Actualizo El subtotal:
                    if(actualizoSubtotal==true){
                        Object cantidad=tabla.getValueAt(row, column);
                        
                        actualizoSubtotal(cantidad,row);}
                }else{
                    //Hago el cambio de cantidad.
                    //System.out.println("No encontro este producto");
                    actualizoTotales();
                }
                
            }
        }
        
        
    }
    
      public void metodoActCant(int linea){
        System.out.println("Enfoco la linea:"+linea);
         //Enfoco el scroll:
         tabla.addRowSelectionInterval(linea,linea);
         if(linea==0){
         linea=1;}
         tabla.scrollRectToVisible(tabla.getCellRect(linea,1, true));
    }
    
    public int siExisteCodigo(Object codigo,int filaActual){
        // Busca si existe el Codigo:
        int numeroFil=tabla.getRowCount();
        int cont=0;
        
        Object toma;
        while (cont<numeroFil){
            try{
                toma=tabla.getValueAt(cont, 0);
                //System.out.println("Compara: "+codigo+" "+toma);
                if(toma.equals(codigo)&& filaActual!=cont){
                  //  System.out.println("Es igual");
                    return cont;
                   
                }
            } catch(Exception e){}
           cont++;
        }
        
        return cont=-1;
    }
    
    private void cambioCantidad(String dato, int row) {
        String codigop=tabla.getValueAt(row,0).toString();
        ResultSet resp;
        resp=conexion.consultarBase("select b.cantidad from producto i,itm_bodega b where i.cod_producto like b.cod_producto and i.cod_producto like '"+codigop+"' and cod_bodega="+bodega );
        int stock=0;
        try {
            resp.beforeFirst();
            resp.next();
            System.out.println("El stock obtenido es:"+stock);
            
            stock=resp.getInt(1);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        
        if(Integer.parseInt(dato.toString())<=stock){
            
        } else{
            JOptionPane.showMessageDialog(this,"Solo hay "+stock+" de este producto. No tenemos "+Integer.parseInt(dato.toString()),"Informacion",JOptionPane.INFORMATION_MESSAGE);
            tabla.setValueAt(stock,row,1);
        }
        
    }
    public void actualizoSubtotal(Object o,int fila){
        double porcentaje=Double.parseDouble(consultarIva());
        int cantidad=Integer.parseInt(o.toString());
        Object p=tabla.getValueAt(fila,3);
        double precio=Double.parseDouble(p.toString());
        //double iva=(precio*porcentaje)/100;
        //double precioIva=precio+iva;
        //double subtotal=cantidad*precioIva;
        double subtotal=cantidad*precio;
        String sub=nf.format(subtotal).replaceAll(",",".");
        tabla.setValueAt(sub, fila, 4);
        
        p=tabla.getValueAt(fila,5);
        precio=Double.parseDouble(p.toString());
        subtotal=cantidad*precio;
        sub=nf.format(subtotal).replaceAll(",",".");
        tabla.setValueAt(sub, fila, 6);
        
    }
    public void mostrarDialogo(){
        
        JOptionPane.showMessageDialog(this,"Este codigo ya esta en la Factura","Informacion",JOptionPane.INFORMATION_MESSAGE);
    }
    
    public void obtengoValores(Object codigo,int fila){
        //Obtengo de la base de datos
        //fila es el dato de entrada
        ResultSet resul=null;
        int NumResp=0;
        try{
            //Saco el Stock:
            String frase="";
            int stock=69;
            
            //Para el Caso que NO sea un Combo:
            if(!esCombo(codigo.toString())){
                
                resul=conexion.consultarBase("select i.nombre,i.precio_normal,b.cantidad,i.precio_costo  from producto i,itm_bodega b where i.cod_producto like b.cod_producto and i.cod_producto like '"+codigo+"' and cod_bodega="+bodega );
                
                NumResp=conexion.obtenerFilas(resul);
                System.out.println("El numero de filas es:"+NumResp);
                stock=resul.getInt(3);
            }else{
                resul=conexion.consultarBase("select i.nombre,i.precio_normal,b.cantidad,i.precio_costo  from producto i where i.cod_producto like '"+codigo+"'");
                NumResp=conexion.obtenerFilas(resul);
                stock=obtenerStockCombo(codigo.toString());
            }
            
            if(NumResp>0){
                
                System.out.println("Llega Hasta aquixxxxx El stock es:"+stock);
                String ca="";
                String mens="Ingrese una Cantidad < "+stock;
                int cantidad=0;
                if(stock==0){
                    JOptionPane.showMessageDialog(this,"No existe stock enla bodega de este producto","Informacion",JOptionPane.INFORMATION_MESSAGE);
                    limpiarFila(fila);
                }else{
                    
                    while(ca.equals("")||ca==null||cantidad>stock||cantidad<=0){
                        
                        try{
                            ca = JOptionPane.showInputDialog(this,mens,"AVISO",2);
                            if(ca==null){
                                //Aplasto cancel
                                break;
                            }
                            
                            ca=ca.replaceAll(" ","");
                            System.out.println("Lo que escribiste fue:"+ca);
                            cantidad=Integer.parseInt(ca);
                        }catch(Exception e){
                            cantidad=-1;
                        }
                        
                    }
                    
                    if(ca!=null){
                        double can = Double.parseDouble(ca);
                        //System.out.println("La cantidad es:"+can);
                        tabla.setValueAt(ca,fila,1);
                        //Obtengo y Muestro el Nombre txt_sub
                        String desc=resul.getString(1);
                        System.out.println("El nombre es:"+desc);
                        tabla.setValueAt(desc,fila,2);
                        //Obtengo y Muestro el Precio:
                        double precio = resul.getDouble(2);
                        double precioCosto=resul.getDouble(4);
                        tabla.setValueAt(nff.format(precioCosto).replaceAll(",","."),fila,5);
                       ///--------------------------------------------------------
                        double ivap=(precio*porcentajer)/100;
                        double precios=precio+Double.parseDouble(nff.format(ivap).replaceAll(",","."));
                        tabla.setValueAt(nff.format(precios).replaceAll(",","."),fila,3);
                        //tabla.setValueAt(precios,fila,3);
                        //Obtengo y Muestro los Totales:
                        //double sub=precios*can;
                        double sub=Double.parseDouble(nff.format(precios).replaceAll(",","."))*can;
                        //System.out.println("El subtotal es:"+sub);
                        tabla.setValueAt(nf.format(sub).replaceAll(",","."),fila,4);
                        
                        double subCosto=precioCosto*can;
                        tabla.setValueAt(nf.format(subCosto).replaceAll(",","."),fila,6);
                    } else{
                        limpiarFila(fila);
                        tabla.clearSelection();
                        
                    }
                    
                }
                
            }else {
                int opccion=0;
                opccion=JOptionPane.showConfirmDialog(this,"Desea Buscar el Producto","Alerta",0);
                if(opccion==0){
                    
                    BuscadorProducto b=new BuscadorProducto(conexion,this,bodega);
                    String value=String.valueOf(tabla.getValueAt(fila,0));
                    if(value==null||value.equals("")){
                        value="texto";
                    }
                    
                    b.txt_buscar.setText(value);
                    b.muestraBusqueda(value);
                    int filaSeleccionada=tabla.getSelectedRow();
                    limpiarFila(filaSeleccionada);
                    
                    
                    
                    
                }
            }
        }catch(java.sql.SQLException e){
            int opccion=0;
            opccion=JOptionPane.showConfirmDialog(this,"Desea Buscar el Producto","Alerta",0);
            if(opccion==0){
                
                BuscadorProducto b=new BuscadorProducto(conexion,this,bodega);
                String value=String.valueOf(tabla.getValueAt(fila,0));
                if(value==null||value.equals("")){
                    value="texto";
                }
                
                b.txt_buscar.setText(value);
                b.muestraBusqueda(value);
                int filaSeleccionada=tabla.getSelectedRow();
                limpiarFila(filaSeleccionada);
                
                
            }
            
        };
        
    }
    
    public int obtenerStockCombo(String codigoCombo){
        //Actualizo Productos del Combo:
        ResultSet resultado;
        resultado=conexion.consultarBase("select * from combo where cod_combo like '"+codigoCombo+"'");
        int PosibleComboPro[]=new int[conexion.obtenerFilas(resultado)];
        try{
            resultado.beforeFirst();
            int i=0;
            while(resultado.next()){
                String codPro=resultado.getString(2);
                int cantPro=resultado.getInt(4);
                
                //Saco el Stock del Producto:
                ResultSet r=conexion.consultarBase("select b.cantidad  from producto i, itm_bodega b where i.cod_producto like b.cod_producto and i.cod_producto like '"+codPro+"' and cod_bodega="+bodega);
                r.next();
                int StockProducto=r.getInt(1);
                PosibleComboPro[i]=StockProducto/cantPro;
                i++;
            }
        }catch(SQLException sqle){
            System.out.println("Error al mostrar los resultados de la consulta");
            System.err.println(sqle);
        }
        
        int NumCombos=PosibleComboPro[0];
        for(int j=0;j<PosibleComboPro.length;j++){
            int punt=PosibleComboPro[j];
            
            if(punt<NumCombos){
                NumCombos=punt;
            }
        }
        
        
        
        return NumCombos;
    }
    double total=0;
    double total_Iva=0;
    double subTotalTodo=0;
    public void actualizoTotales(){
        // System.out.println("Entra en actualiza");
        int numeroCol=tabla.getRowCount();
        int cont=0;
        double acumula=0;
        String toma;
        String tomaCosto;
        double acumulaCosto=0;
        
        //Muestro Los Subtotales:
        while (cont<numeroCol){
            
            try{
                toma=tabla.getValueAt(cont, 4).toString();
                acumula=acumula+Double.parseDouble(toma);
                tomaCosto=tabla.getValueAt(cont, 6).toString();
                acumulaCosto=acumulaCosto+Double.parseDouble(tomaCosto);
            } catch(Exception e){};
            cont++;
        }
        txt_subCosot.setText(String.valueOf(nf.format(acumulaCosto).replaceAll(",",".")));
        String ivaCompleto="1."+Cortar(String.valueOf(porcentajer)); //
        acumula=acumula/Double.parseDouble(ivaCompleto);
        //Muestro el Descuento
        double porcentaje=0;
        double descuento=0;
        if(ck_desc.isSelected()){
            String valDesc=txt_desc.getText();
            if(valDesc.equals("")){
                valDesc="0";
            }
            descuento=Double.parseDouble(valDesc);
            
        }else{
            if(txt_porDesc.getText().equals("")){
                porcentaje=0;
            }else{
                porcentaje=Double.parseDouble(txt_porDesc.getText());    
            }
            descuento=(acumula*porcentaje)/100;
            txt_desc.setText(nf.format(descuento).replaceAll(",","."));
        }
        //Muestro Total:
        //
        subTotalTodo=acumula;
        total=(acumula-Double.parseDouble(nf.format(descuento).replaceAll(",",".")));
        total_Iva=(total*porcentajer)/100;
        double totalTodo=total+Double.parseDouble(nf.format(total_Iva).replaceAll(",","."));
        txt_tot.setText(nf.format((totalTodo)).replaceAll(",","."));
    }
    public String Cortar(String numero){
        String numeros="";
        for(int i=0;i<numero.length();i++){
            String caracter=numero.substring(i,i+1);
            if(caracter.equals(".") || caracter.equals(",")){
            }else{
               numeros+=caracter;
            }
        }
        return numeros;
    }
    public int siExisteCodigos(Object codigoEnt){
        String codigo=codigoEnt.toString();
        int resp=0;
        int numeroFil=tabla.getRowCount();
        
        int contador=0;
        while (contador<numeroFil){
            String toma=tabla.getValueAt(contador, 0).toString();
            if(toma.equals(codigo)){
                System.out.println("Es igual"+" la comparacion de: "+toma+"="+codigo);
                resp=contador;
                break;
            }
        }
        
        return resp;
    }
    
    public void limpiarFila(int fila){
        tabla.setValueAt(null,fila,0);
        tabla.setValueAt("",fila,1);
        tabla.setValueAt("",fila,2);
        tabla.setValueAt("",fila,3);
        tabla.setValueAt("",fila,4);
        actualizoTotales();
    }
    public int cuentaFilaOcupadas(){
        int totalfilas=tabla.getRowCount();
        int contador=0;
        Object valor;
        for (contador=0;contador<totalfilas;contador++) {
            valor=tabla.getValueAt(contador,0);
            if (valor==null){
                break;
            }
            
        }
        //System.out.println("El numero de fila ocupadas es:"+contador);
        return contador;
    }
    
    public int cuentaProductos(){
    
    int totalfilas=tabla.getRowCount();     
    System.out.println("El total filas es:"+totalfilas);
    int totalProductos=0;
    int cuentanulls=0;
    
    Object valor;
    for(int contador=0;contador<totalfilas;contador++) {
        valor=tabla.getValueAt(contador,0);
        System.out.println(contador+")valor es:"+valor+"\n");
        if(valor==null){
        //System.out.print("El producto es null");
        cuentanulls++;    
        }else{
        //System.out.print("El producto NO es null");    
        totalProductos++;
        }
        
    }
    
    
   //System.out.println("El total de nulls es: "+cuentanulls);
   //System.out.println("El total de productos son: "+totalProductos);
    return totalProductos;
    };
    //consultar el valor del iva de la tabla parametros
    //el valor del iva que se toma es el ultimo valor ingresado
    public String consultarIva(){
        String iva="";
        java.util.Vector vecConsulta=conexion.consulta("select iva from parametros order by codigo desc limit 1");
        java.util.Vector vecInterno=new java.util.Vector();
        for(int i=0;i<vecConsulta.size();i++){
                vecInterno=(java.util.Vector)vecConsulta.elementAt(i);
                iva=vecInterno.elementAt(0).toString();
        }
        return iva;
    };
    // Variables declaration - do not modify//GEN-BEGIN:variables
    public javax.swing.JButton bt_ap;
    public javax.swing.JButton bt_borrar;
    public javax.swing.JButton bt_hist;
    public javax.swing.JButton bt_limpiar;
    public javax.swing.JButton bt_mod;
    public javax.swing.JButton bt_registra;
    public javax.swing.JButton btn_BuscaFac;
    public javax.swing.JButton btn_anulaFac;
    private javax.swing.JCheckBox ck_desc;
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel13;
    private javax.swing.JLabel jLabel14;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    public javax.swing.JLabel lbl_anulacion;
    private javax.swing.JLabel lbl_f;
    public javax.swing.JTextField lbl_fact;
    private javax.swing.JLabel lbl_fecha;
    public javax.swing.JLabel lbl_fechaAnulacion;
    private javax.swing.JLabel lbl_vend;
    public javax.swing.JTable tabla;
    public javax.swing.JTextField txt_codFac;
    private javax.swing.JTextField txt_desc;
    public javax.swing.JTextField txt_dir;
    public javax.swing.JTextField txt_id;
    public javax.swing.JTextArea txt_motAnula;
    public javax.swing.JTextField txt_nom;
    private javax.swing.JTextField txt_porDesc;
    private javax.swing.JTextField txt_subCosot;
    public javax.swing.JTextField txt_tel;
    public javax.swing.JTextArea txt_tot;
    private javax.swing.JPasswordField txt_vend;
    // End of variables declaration//GEN-END:variables
    
}
